package com.ruoyi.finance.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.finance.domain.DefaultAccountSet;
import com.ruoyi.finance.domain.VoucherDetail;
import com.ruoyi.finance.mapper.DefaultAccountSetMapper;
import com.ruoyi.finance.mapper.VoucherDetailMapper;
import com.ruoyi.finance.vo.VoucherDetailVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.finance.mapper.VoucherMapper;
import com.ruoyi.finance.domain.Voucher;
import com.ruoyi.finance.service.IVoucherService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 凭证列表Service业务层处理
 *
 * @author ruoyi
 * @date 2025-02-27
 */
@Service
public class VoucherServiceImpl implements IVoucherService
{
    @Autowired
    private VoucherMapper voucherMapper;

    @Autowired
    private DefaultAccountSetMapper defaultAccountSetMapper;

    @Autowired
    private VoucherDetailMapper voucherDetailMapper;

    /**
     * 查询凭证列表
     *
     * @param voucherId 凭证列表主键
     * @return 凭证列表
     */
    @Override
    public Voucher selectVoucherByVoucherId(Long voucherId)
    {
        return voucherMapper.selectVoucherByVoucherId(voucherId);
    }

    /**
     * 查询凭证列表列表
     *
     * @param voucher 凭证列表
     * @return 凭证列表
     */
    @Override
    public List<Voucher> selectVoucherList(Voucher voucher)
    {
        return voucherMapper.selectVoucherList(voucher);
    }

    /**
     * 新增凭证列表
     *
     * @param voucher 凭证列表
     * @return 结果
     */
    @Override
    public int insertVoucher(Voucher voucher)
    {
        voucher.setCreateTime(DateUtils.getNowDate());
        return voucherMapper.insertVoucher(voucher);
    }

    /**
     * 修改凭证列表
     *
     * @param voucher 凭证列表
     * @return 结果
     */
    @Override
    public int updateVoucher(Voucher voucher)
    {
        voucher.setUpdateTime(DateUtils.getNowDate());
        return voucherMapper.updateVoucher(voucher);
    }

    /**
     * 批量删除凭证列表
     *
     * @param voucherIds 需要删除的凭证列表主键
     * @return 结果
     */
    @Override
    public int deleteVoucherByVoucherIds(Long[] voucherIds)
    {
        return voucherMapper.deleteVoucherByVoucherIds(voucherIds);
    }

    /**
     * 删除凭证列表信息
     *
     * @param voucherId 凭证列表主键
     * @return 结果
     */
    @Override
    public int deleteVoucherByVoucherId(Long voucherId)
    {
        return voucherMapper.deleteVoucherByVoucherId(voucherId);
    }

    @Override
    @Transactional
    //voucherDetailVo前端传过来的数据
    public String toadd(VoucherDetailVo voucherDetailVo) {

        // 检查传入的 voucherDetailVo 是否为空
        if (voucherDetailVo == null) {
            return "传入的凭证详情 VO 对象为空，请检查数据";
        }

        // 创建凭证表对象
        Voucher voucher = new Voucher();

        // 检查 voucherId 是否为空
        if (voucherDetailVo.getVoucherId() == null) {
            return "凭证 ID 为空，请提供有效的凭证 ID";
        }
        voucher.setVoucherId(voucherDetailVo.getVoucherId());

        // 检查 voucherNo 是否为空
        if (voucherDetailVo.getVoucherNo() == null || voucherDetailVo.getVoucherNo().isEmpty()) {
            return "凭证编号为空，请提供有效的凭证编号";
        }
        voucher.setVoucherNo(voucherDetailVo.getVoucherNo());

        // 设置会计期间
        voucher.setAccountPeriod(String.valueOf(new Date()));

        // 检查附件数量是否为负数
        if (voucherDetailVo.getAttachmentCount() < 0) {
            return "附件数量不能为负数，请提供有效的附件数量";
        }
        voucher.setAttachmentCount(voucherDetailVo.getAttachmentCount());

        // 获取当前用户
        Long userId = null;
        try {
            userId = SecurityUtils.getLoginUser().getUserId();
        } catch (Exception e) {
            return "获取当前用户信息失败，请检查登录状态";
        }

        QueryWrapper<DefaultAccountSet> defaultAccountSetQueryWrapper = new QueryWrapper<>();
        defaultAccountSetQueryWrapper.eq("user_id", userId);
        DefaultAccountSet defaultAccountSet = defaultAccountSetMapper.selectOne(defaultAccountSetQueryWrapper);

        // 判断默认账套是否为空
        if (defaultAccountSet == null) {
            return "请先设置默认账套";
        }

        // 检查账套 ID 是否为空
        if (defaultAccountSet.getAccountSetId() == null) {
            return "默认账套的账套 ID 为空，请检查账套设置";
        }
        voucher.setAccountId(defaultAccountSet.getAccountSetId());

        // 检查 wordId 是否为空
        if (voucherDetailVo.getWordId() == null) {
            return "Word ID 为空，请提供有效的 Word ID";
        }
        voucher.setWordId(voucherDetailVo.getWordId());

        // 获取明细表集合
        List<VoucherDetail> voucherDetails = voucherDetailVo.getVoucherDetail();

        // 检查明细表集合是否为空
        if (voucherDetails == null || voucherDetails.isEmpty()) {
            return "凭证明细表集合为空，请提供有效的凭证明细数据";
        }

        // 计算总金额，使用 Stream 流
        double totalAmount = voucherDetailVo.getTotalAmount() +
                voucherDetails.stream()
                        .mapToDouble(VoucherDetail::getDebitAmount)
                        .sum();
        voucher.setTotalAmount(totalAmount);

        // 添加账套主表
        try {
            voucherMapper.insertVoucher(voucher);
        } catch (Exception e) {
            return "插入凭证主表数据失败，请检查数据库连接或数据格式：" + e.getMessage();
        }

        // 插入明细记录，使用 Stream 流
        try {
            voucherDetails.stream()
                    .map(detail -> {
                        VoucherDetail newDetail = new VoucherDetail();
                        newDetail.setVoucherId(voucher.getVoucherId());
                        newDetail.setSubjectId(detail.getSubjectId());
                        newDetail.setSummaryId(detail.getSummaryId());
                        newDetail.setDebitAmount(detail.getDebitAmount());
                        newDetail.setCreditAmount(detail.getCreditAmount());
                        return newDetail;
                    })
                    .forEach(voucherDetailMapper::insertVoucherDetail);
        } catch (Exception e) {
            return "插入凭证明细数据失败，请检查数据库连接或数据格式：" + e.getMessage();
        }

        return "添加成功";
    }
}
